/*
 * @Author: xiaosihan 
 * @Date: 2024-08-01 15:32:26 
 * @Last Modified by: xiaosihan
 * @Last Modified time: 2025-08-23 20:43:40
 */

import {
    EventDispatcher,
    MeshBasicMaterial,
    MeshLambertMaterial,
    MeshPhongMaterial,
    MeshPhysicalMaterial,
    MeshStandardMaterial,
} from "three";
import shortid from "shortid";
import pathBrowserify from "path-browserify";
import { GUI } from "three/examples/jsm/libs/lil-gui.module.min.js";

class Utils {

    constructor() {
        // 仅在开发环境下打印日志
        if (this.isDev) {
            console.log("isBrowser", this.isBrowser);
            console.log("isDev", this.isDev);
            console.log("isProd", this.isProd);
        }
    }

    // 浏览器环境
    isBrowser = (typeof window === 'object');

    // 开发环境
    isDev = (() => {
        // 假设Vite会设置正确的环境变量
        return import.meta.env.MODE === "development";
    })();

    // 正式环境
    isProd = (() => {
        // 假设Vite会设置正确的环境变量
        return import.meta.env.MODE === "production";
    })();

    // 测试环境
    isTest = false; // 纯前端项目中，测试环境可以通过其他方式判断

    // 设备检测 - 简化版，只判断是否为iOS设备
    isIPhone = (() => {
        if (this.isBrowser) {
            return /iPhone/i.test(navigator.userAgent);
        }
        return false;
    })();

    // 设备检测 - 简化版，只判断是否为华为设备
    isHuawei = (() => {
        if (this.isBrowser) {
            return /HUAWEI/i.test(navigator.userAgent);
        }
        return false;
    })();

    // 封装本地存储设置方法
    setStorageSync(key: string, value: string) {
        if (this.isBrowser) {
            localStorage.setItem(key, value);
        }
    }

    // 封装本地存储获取方法
    getStorageSync(key: string) {
        if (this.isBrowser) {
            return localStorage.getItem(key);
        }
        return null;
    }

    // 封装本地存储删除方法
    removeStorageSync(key: string) {
        if (this.isBrowser) {
            localStorage.removeItem(key);
        }
    }

    // 封装本地存储清空方法
    clearStorageSync() {
        if (this.isBrowser) {
            localStorage.clear();
        }
    }

    // 生成短ID
    uuid() {
        const shortId = shortid();
        return shortId;
    }

    // 解析URL路径
    parseUrl(url: string) {
        const { root, dir, base, ext, name, } = pathBrowserify.parse(url);
        return { root, dir, base, ext, name };
    }

    // 编辑材质
    editorMaterial(
        material:
            | MeshBasicMaterial
            | MeshLambertMaterial
            | MeshPhongMaterial
            | MeshPhysicalMaterial
            | MeshStandardMaterial
    ) {
        const config: { [key: string]: any } = {};

        const controlPanel = new GUI({ width: 400 });

        controlPanel.title("材质编辑器");
        controlPanel.show(true);

        //颜色修改
        controlPanel
            .addColor(material as MeshStandardMaterial, "color")
            .name("材质颜色")
            .onChange((color: any) => {
                config["color"] = `#${color.getHexString()}`;
            });

        //金属性
        if (material.hasOwnProperty("metalness")) {
            controlPanel
                .add(material as MeshStandardMaterial, "metalness", 0, 1, 0.01)
                .name("金属性")
                .onChange((metalness) => {
                    config["metalness"] = metalness;
                });
        }
        //粗糙度
        if (material.hasOwnProperty("roughness")) {
            controlPanel
                .add(material as MeshStandardMaterial, "roughness", 0, 1, 0.01)
                .name("粗糙度")
                .onChange((roughness) => {
                    config["roughness"] = roughness;
                });
        }

        function stringifyWithoutQuotes(obj: any) {
            let result = "";
            function stringifyValue(value: any) {
                if (typeof value === "string") {
                    return `"${value}"`; // 字符串值需要引号
                } else if (typeof value === "object" && value !== null) {
                    // 如果值是对象或数组，递归处理（这里简单返回字符串表示）
                    return "..."; // 或者您可以递归调用 stringifyWithoutQuotesOnKeys(value) 并处理嵌套
                } else {
                    // 对于其他类型（如数字、布尔值、null），直接返回其字符串表示
                    return String(value);
                }
            }

            for (let key in obj) {
                if (obj.hasOwnProperty(key)) {
                    result += `${key}: ${stringifyValue(obj[key])}, `;
                }
            }
            // 移除末尾的逗号和空格
            return result.trim().slice(0, -1);
        }

        controlPanel
            .add(
                {
                    click: () => {
                        navigator.clipboard.writeText(stringifyWithoutQuotes(config));
                        controlPanel.destroy();
                    },
                },
                "click"
            )
            .name("确定,并复制配置到剪贴板");
    }

}
// Utils类结束

// 创建Utils实例
const utils = new Utils();
// 导出utils实例
export default utils;